# -*- coding: utf-8 -*-
# @Time    : 2018/6/6 下午10:23
# @Author  : Lavn
# @Email   : 959875529@qq.com
# @File    : metaClassDemo.py
# @Software: PyCharm

#在大多数编程语言中，类就是一组用来描述如何生成一个对象的代码段。在 Python 中这一点也是一样的
#但是，Python 中的类有一点跟大多数的编程语言不同，在 Python 中，可以把类理解成也是一种对象。对的，这里没有写错，就是对象。
#因为只要使用关键字 class ，Python 解释器在执行的时候就会创建一个对象。
# 当程序运行这段代码的时候，就会在内存中创建一个对象，名字就是ObjectCreator。这个对象（类）自身拥有创建对象（类实例）的能力，而这就是为什么它是一个类的原因。
# 但是，它的本质仍然是一个对象

# def echo(ob):
#     print(ob)
#
# class ObjectCreator(object):
#     pass
#
# mObject = ObjectCreator()
# print(mObject)
#
# # 可以直接打印一个类，因为它其实也是一个对象
# print(ObjectCreator)
# # 可以直接把一个类作为参数传给函数（注意这里是类，是没有实例化的）
# echo(ObjectCreator)
# # 也可以直接把类赋值给一个变量
# objectCreator = ObjectCreator
# print(objectCreator)


#type使用
# from packageTest.hello import Hello
#
# h = Hello()
# h.hello()
#
# print(type(Hello))
# print(type(h))


# #type动态创建
# def printHello(self, name='Py1'):
#     # 定义一个打印 Hello 的函数
#     print('Hello,', name)
# #可以多继承 单一继承用tuple 所以(object,)
# Hello = type('Hello', (object,), dict(hello=printHello,hello1="haha1"))
# h = Hello()
# #dict 绑定参数
# print(h.hello1)
# # 调用 Hello 类的方法
# h.hello()
# # 查看 Hello class 的类型
# print(type(Hello))
# # 查看实例 h 的类型
# print(type(h))

# #元类：元类就是用来创建类的。也可以换个理解方式就是：元类就是类的类。
# #  python 所有东西都是对象
# #元类就是类的类。也就是元类就是负责创建类的一种东西。你也可以理解为，元类就是负责生成类的。而 type 就是内建的元类。也就是 Python 自带的元类。
# age = 23
# print(age.__class__)
# # 字符串
# name = '两点水'
# print(name.__class__)
# # 函数
# def fu():
#     pass
# print(fu.__class__)
# # 实例
# class eat(object):
#     pass
# mEat = eat()
# print(mEat.__class__)
# print('\n')
# #__class__的 __class__
# print(age.__class__.__class__)
# print(name.__class__.__class__)
# print(fu.__class__.__class__)
# print(mEat.__class__.__class__)



#lambda
# func=lambda x:x+1
# print(func(1))
# #2
# print(func(2))
# #3
#
# #以上lambda等同于以下函数
# def func(x):
#     return(x+1)

#demo1
# class SayMetaClass(type):
#     # 传入三大永恒命题：类名称、父类、属性
#     def __new__(cls, name, bases, attrs):
#         # 创造“天赋”
#         attrs['say_' + name] = lambda self, value, saying=name: print(saying + ',' + value + '!')
#         # 传承三大永恒命题：类名称、父类、属性
#         return type.__new__(cls, name, bases, attrs)
#
#
# # 一生二：创建类
# class Hello1(object, metaclass=SayMetaClass):
#     pass
#
#
# # 二生三：创建实列
# hello = Hello1()
#
# # 三生万物：调用实例方法
# hello.say_Hello1('world!')


#demo2
# 道生一
class ListMetaclass(type):
    def __new__(cls, name, bases, attrs):
        # 天赋：通过add方法将值绑定
        attrs['add'] = lambda self, value: self.append(value)
        return type.__new__(cls, name, bases, attrs)
# 一生二
class MyList(list, metaclass=ListMetaclass):
    pass
# 二生三
L = MyList()
# 三生万物
L.add(1)

print(L)


#而普通的list没有add()方法
#报错
L2 = list()
L2.add(1)